class AVL {
	private:
		struct node {
			int data;
			int balance:2;
			node *left;
			node *right;
			node(const int& d, int b = 0):
				data(d), balance(b), left(0), right(0) {}
		};
		node *tnode;
		const int* tdata;
		unsigned int size_var;
		void AVL_clear(node*);
		inline void AVL_LL_rotate(node*&);
		inline void AVL_RR_rotate(node*&);
		inline void AVL_LR_rotate(node*&);
		inline void AVL_RL_rotate(node*&);
		bool AVL_insert(node*&);
		bool AVL_delete(node*&);
		bool AVL_delmin(node*&);
		void AVL_copy(node*&, node*);
		//void AVL_print(node*) const;
		int AVL_check(node*) const;
	public:
		node *root;
		AVL(void);
		AVL(const AVL&);
		~AVL(void);
		bool empty(void) const;
		unsigned int size(void) const;
		void clear(void);
		bool find(const int&) const;
		void insert(const int&);
		void extract(const int&);
		//void print(void) const;
		bool check(void) const;
};
